import java.util.PriorityQueue;

//创建一个类，用来描述定时器中的一个任务
class MyTimertask implements Comparable<MyTimertask>{
    private long time;                 //任务什么时候执行，毫秒级的时间戳
    private Runnable runnable;         //具体的任务
    public MyTimertask(Runnable runnable,long delay){
        time=System.currentTimeMillis()+delay;
        this.runnable=runnable;
    }

    public long getTime() {
        return time;
    }

    public Runnable getRunnable() {
        return runnable;
    }

    @Override
    public int compareTo(MyTimertask o) {
        return  (int)(this.time-o.time);
    }
}
class MyTimer {
    //使用优先级队列
    private PriorityQueue<MyTimertask> queue = new PriorityQueue<>();

    //定时器核心方法
    public void schedule(Runnable runnable, long delay) {
        synchronized (this) {
            MyTimertask task = new MyTimertask(runnable, delay);
            queue.offer(task);                            //新来一个任务，就需要把线程唤醒
            this.notify();
        }
    }
    //定时器还要搞个扫描方法，内部的线程。一方面负责监控队首元素是否到点了，是否应该执行，
    // 一方面当任务到了之后，就要调用这里的Runable的run方法执行任务
    public MyTimer() {
        Thread t = new Thread(() -> {
            while (true) {
                synchronized (this) {
                    //队列为空，此时不可以取元素
                    while (queue.isEmpty()) {
                        try {
                            this.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    MyTimertask Task = queue.peek();                         //任务的时间
                    long curTime = System.currentTimeMillis();               //当前的系统时间
                    if (curTime >= Task.getTime()) {                         //系统时间14：01>任务时间14：00 ——执行任务
                        queue.poll();
                        Task.getRunnable().run();
                    } else {
                        try {
                          this.wait(Task.getTime() - curTime);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
         t.start();
    }
}
public class Demo3 {
    public static void main(String[] args) {
        MyTimer myTimer = new MyTimer();
        myTimer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello");
            }
        }, 3000);
        myTimer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("god");
            }
        }, 2000);
        myTimer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("good");
            }
        }, 1000);
    }








}